#ifndef SM3_HASH_H
#define SM3_HASH_H

#include <stdint.h>
#include <stddef.h>
#include <gmssl/sm3.h>
#include <gmssl/rand.h>

#ifdef __cplusplus
extern "C"
{
#endif

    // 直接使用GmSSL的SM3上下文
    typedef SM3_CTX sm3_ctx_t;

    // 初始化SM3上下文
    void sm3_init(sm3_ctx_t *ctx);

    // 更新SM3上下文
    void sm3_update(sm3_ctx_t *ctx, const uint8_t *data, size_t data_len);

    // 计算SM3哈希值
    void sm3_final(sm3_ctx_t *ctx, uint8_t digest[32]);

    // 一步完成SM3哈希计算
    void sm3_hash(const uint8_t *data, size_t data_len, uint8_t digest[32]);

    // 带盐值的口令哈希
    void sm3_hmac(const uint8_t *key, size_t key_len,
                  const uint8_t *data, size_t data_len,
                  uint8_t mac[32]);

    // 生成随机盐值
    void generate_salt(uint8_t salt[16]);

    // 带盐值的密码哈希
    void hash_password(const char *password, const uint8_t salt[16], uint8_t hash[32]);

    // 验证密码
    int verify_password(const char *password, const uint8_t salt[16], const uint8_t stored_hash[32]);

#ifdef __cplusplus
}
#endif

#endif /* SM3_HASH_H */